/*
* Create Author : xiaopeng.li
* Create Date : 2013-1-23
* Project : dianping-java-samples
* File Name : DemoApiTool.java
*
* Copyright (c) 2010-2015 by Shanghai HanTao Information Co., Ltd.
* All rights reserved.
*
*/
package com.dianping.open.weixin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* 功能描述: API 工具 <p>
*
*
* @author : xiaopeng.li <p>
*
* @version 1.0 Aug 26, 2013
*
* @since weixin-sdk
*/
public class ApiTool
{
private static final Logger LOGGER = LoggerFactory.getLogger(ApiTool.class);
public static String sign(String appKey, String secret, Map<String, String> paramMap)
{
// 对参数名进行字典排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);
// 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(appKey);
for (String key : keyArray)
{
stringBuilder.append(key).append(paramMap.get(key));
}
stringBuilder.append(secret);
String codes = stringBuilder.toString();
// SHA-1编码, 这里使用的是Apache
// codec,即可获得签名(shaHex()会首先将中文转换为UTF8编码然后进行sha1计算,使用其他的工具包请注意UTF8编码转换)
/*
* 以下sha1签名代码效果等同 byte[] sha =
* org.apache.commons.codec.digest.DigestUtils
* .sha(org.apache.commons.codec
* .binary.StringUtils.getBytesUtf8(codes)); String sign =
* org.apache.commons
* .codec.binary.Hex.encodeHexString(sha).toUpperCase();
*/
String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();
return sign;
}
public static String getQueryString(String appKey, String secret, Map<String, String> paramMap)
{
String sign = sign(appKey, secret, paramMap);
// 添加签名
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("appkey=").append(appKey).append("&sign=").append(sign);
for (Entry<String, String> entry : paramMap.entrySet())
{
stringBuilder.append('&').append(entry.getKey()).append('=').append(entry.getValue());
}
String queryString = stringBuilder.toString();
return queryString;
}
public static String requestApi(String apiUrl, String appKey, String secret, Map<String, String> paramMap)
{
String queryString = getQueryString(appKey, secret, paramMap);
StringBuffer response = new StringBuffer();
HttpClientParams httpConnectionParams = new HttpClientParams();
httpConnectionParams.setConnectionManagerTimeout(1000);
HttpClient client = new HttpClient(httpConnectionParams);
HttpMethod method = new GetMethod(apiUrl);
try
{
if (StringUtils.isNotBlank(queryString))
{
// Encode query string with UTF-8
String encodeQuery = URIUtil.encodeQuery(queryString, "UTF-8");
LOGGER.debug("Encoded Query:" + encodeQuery);
method.setQueryString(encodeQuery);
}
client.executeMethod(method);
BufferedReader reader = new BufferedReader(
new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null)
{
response.append(line).append(System.getProperty("line.separator"));
}
reader.close();
}
catch (URIException e)
{
LOGGER.error("Can not encode query: " + queryString + " with charset UTF-8. ", e);
}
catch (IOException e)
{
LOGGER.error("Request URL: " + apiUrl + " failed. ", e);
}
finally
{
method.releaseConnection();
}
return response.toString();
}
public static String requestPostApi(String apiUrl, String appKey, String secret, Map<String, String> paramMap)
{
StringBuffer response = new StringBuffer();
HttpClientParams httpConnectionParams = new HttpClientParams();
httpConnectionParams.setConnectionManagerTimeout(1000);
HttpClient client = new HttpClient(httpConnectionParams);
PostMethod method = new PostMethod(apiUrl);
try
{
String sign = sign(appKey, secret, paramMap);
paramMap.put("sign", sign);
paramMap.put("appkey", appKey);
// 设置HTTP Post数据
for (Map.Entry<String, String> entry : paramMap.entrySet())
{
method.addParameter(entry.getKey(), entry.getValue());
}
method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
client.executeMethod(method);
BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null)
{
response.append(line).append(System.getProperty("line.separator"));
}
reader.close();
}
catch (IOException e)
{
LOGGER.error("Request URL: " + apiUrl + " failed. ", e);
}
finally
{
method.releaseConnection();
}
return response.toString();
}
}